#!/bin/bash

# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
if [ "$(id -u)" != "0" ]; then
   log_error "此脚本必须以root权限运行" 
   exit 1
fi

# 配置参数
APP_DIR="/var/www/box-user"
GUNICORN_CONFIG="${APP_DIR}/gunicorn_config.py"
START_SCRIPT="${APP_DIR}/start.sh"
SUPERVISOR_CONFIG="/etc/supervisord.d/box-user.ini"

# CPU和内存信息
CPU_COUNT=$(grep -c processor /proc/cpuinfo)
TOTAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
MEMORY_GB=$(echo "scale=2; $TOTAL_MEMORY/1024/1024" | bc)

# 根据系统资源计算合适的worker数量
WORKERS=$(( 2 * $CPU_COUNT + 1 ))
if [ $WORKERS -gt 12 ]; then
    WORKERS=12  # 设置上限
fi

# 根据内存计算每个worker的线程数
THREADS=2
if (( $(echo "$MEMORY_GB > 8" | bc -l) )); then
    THREADS=4
fi
if (( $(echo "$MEMORY_GB > 16" | bc -l) )); then
    THREADS=8
fi

log_info "系统信息:"
log_info "  CPU核心数: $CPU_COUNT"
log_info "  内存大小: ${MEMORY_GB}GB"
log_info "  计算出的Worker数: $WORKERS"
log_info "  每个Worker的线程数: $THREADS"

# 检查应用目录是否存在
if [ ! -d "$APP_DIR" ]; then
    log_error "应用目录 $APP_DIR 不存在！请先运行初始部署脚本。"
    exit 1
fi

# 创建Gunicorn配置文件
log_info "创建Gunicorn配置文件..."
cat > "$GUNICORN_CONFIG" << EOF
# Gunicorn配置文件 - 妙趣拾光锦盒用户系统
import multiprocessing
import os

# 绑定地址和端口 - 绑定到所有接口，允许从任何IP访问
bind = "0.0.0.0:8000"

# 工作进程数量
workers = ${WORKERS}  # 2*CPUs+1

# 工作线程数量
threads = ${THREADS}

# 工作模式 - 使用gevent异步处理请求
worker_class = "gevent"

# 请求超时时间(秒)
timeout = 120

# 优雅重启超时(秒)
graceful_timeout = 30

# 最大请求数，超过此数量后worker会重启
max_requests = 1000
max_requests_jitter = 100

# 数据包大小(字节)
limit_request_line = 4096
limit_request_fields = 100
limit_request_field_size = 8190

# 日志配置
errorlog = os.path.join("/var/log/box-user", "gunicorn-error.log")
accesslog = os.path.join("/var/log/box-user", "gunicorn-access.log")
loglevel = "info"
access_log_format = '%({X-Forwarded-For}i)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

# 守护进程模式 (在supervisor下不应设置为True)
daemon = False

# 进程名称
proc_name = "box-user"

# 保持连接选项
keepalive = 5

# 优雅地关闭worker
preload_app = True

# 请求处理前钩子
def on_starting(server):
    server.log.info("Starting Gunicorn server for box-user application")

# 配置服务器关闭事件钩子
def on_exit(server):
    server.log.info("Stopping Gunicorn server for box-user application")
EOF

# 更新启动脚本
log_info "更新应用启动脚本..."
cat > "$START_SCRIPT" << EOF
#!/bin/bash
cd ${APP_DIR}
source venv/bin/activate
export DJANGO_SETTINGS_MODULE=boxuser.settings_production
exec gunicorn --config=${GUNICORN_CONFIG} boxuser.wsgi:application
EOF

chmod +x "$START_SCRIPT"

# 安装必要依赖
log_info "安装必要的Python依赖..."
cd $APP_DIR
source venv/bin/activate
pip install gunicorn gevent

# 更新Supervisor配置
log_info "更新Supervisor配置..."
if [ -f "$SUPERVISOR_CONFIG" ]; then
    # 备份原配置
    cp "$SUPERVISOR_CONFIG" "${SUPERVISOR_CONFIG}.bak"
    
    # 更新配置
    cat > "$SUPERVISOR_CONFIG" << EOF
[program:box-user]
command=${APP_DIR}/start.sh
directory=${APP_DIR}
user=root
autostart=true
autorestart=true
startretries=3
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/box-user/supervisor.err.log
stdout_logfile=/var/log/box-user/supervisor.out.log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
EOF
else
    log_warn "Supervisor配置文件不存在: ${SUPERVISOR_CONFIG}"
    log_info "尝试创建..."
    mkdir -p /etc/supervisord.d/
    cat > "$SUPERVISOR_CONFIG" << EOF
[program:box-user]
command=${APP_DIR}/start.sh
directory=${APP_DIR}
user=root
autostart=true
autorestart=true
startretries=3
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/box-user/supervisor.err.log
stdout_logfile=/var/log/box-user/supervisor.out.log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
EOF
fi

# 创建日志目录
log_info "确保日志目录存在..."
mkdir -p /var/log/box-user
chmod 755 /var/log/box-user

# 更新Nginx配置
log_info "检查Nginx配置..."
NGINX_CONFIG="/etc/nginx/conf.d/box-user.conf"
if [ -f "$NGINX_CONFIG" ]; then
    # 检查Nginx代理设置
    if grep -q "proxy_pass http://127.0.0.1:8000" "$NGINX_CONFIG"; then
        log_info "更新Nginx代理配置..."
        # 创建备份
        cp "$NGINX_CONFIG" "${NGINX_CONFIG}.bak"
        # 更新配置
        sed -i 's|proxy_pass http://127.0.0.1:8000|proxy_pass http://localhost:8000|g' "$NGINX_CONFIG"
        # 重新加载Nginx配置
        systemctl reload nginx
        log_info "Nginx配置已更新"
    fi
fi

# 重新加载Supervisor配置
log_info "重新加载Supervisor配置..."
supervisorctl update box-user

# 重启应用
log_info "重启应用服务..."
supervisorctl restart box-user

# 等待一段时间，让服务启动
sleep 5

# 检查服务状态
log_info "检查服务状态..."
STATUS=$(supervisorctl status box-user)
echo "$STATUS"

if echo "$STATUS" | grep -q "RUNNING"; then
    log_info "应用成功使用优化后的Gunicorn配置重启!"
    
    # 测试服务可访问性
    log_info "测试服务可访问性..."
    
    # 测试本地访问
    curl -s -o /dev/null -w "localhost:8000 HTTP状态码: %{http_code}\n" http://localhost:8000/
    
    # 测试127.0.0.1访问
    curl -s -o /dev/null -w "127.0.0.1:8000 HTTP状态码: %{http_code}\n" http://127.0.0.1:8000/
    
    # 获取本机IP
    SERVER_IP=$(hostname -I | awk '{print $1}')
    if [ ! -z "$SERVER_IP" ]; then
        curl -s -o /dev/null -w "${SERVER_IP}:8000 HTTP状态码: %{http_code}\n" http://${SERVER_IP}:8000/
    fi
    
    log_info "现在应用应该可以通过任何接口访问，包括127.0.0.1和服务器IP"
else
    log_error "应用可能未正常启动，请检查日志:"
    tail -n 50 /var/log/box-user/supervisor.err.log
fi

log_info "Gunicorn优化配置完成!"
log_info "配置文件: ${GUNICORN_CONFIG}"
log_info "启动脚本: ${START_SCRIPT}"
log_info "Supervisor配置: ${SUPERVISOR_CONFIG}"
log_info "注意: Gunicorn现在绑定到0.0.0.0:8000，可以从任何IP地址访问" 